import requests
from typing import List, Dict
from dataclasses import dataclass
from app.db.database import SessionLocal
from app.db.crud import create_tpost
from app.pacong.content_fetcher import ContentFetcher

@dataclass
class ThePaperNewsItem:
    """澎湃新闻热点条目的数据类"""
    cont_id: str
    name: str
    pub_time_long: str

class ThePaperCrawler(ContentFetcher):
    """
    用于从澎湃新闻网站获取热点新闻数据并处理的类。
    """

    def __init__(self):
        """
        初始化类实例。
        """
        self.base_url = "https://www.thepaper.cn"
        self.mobile_base_url = "https://m.thepaper.cn"
        self.api_url = "https://cache.thepaper.cn/contentapi/wwwIndex/rightSidebar"
        self.content_type = 12  # 澎湃新闻的source_id设为12

    def my_fetch(self) -> Dict:
        """
        发送HTTP GET请求，获取API响应。

        :return: 返回JSON响应。
        :raises: 如果请求失败，抛出HTTPError。
        """
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(self.api_url, headers=headers)
        response.raise_for_status()
        return response.json()

    def fetch_content(self) -> List[Dict]:
        """
        获取并处理热点新闻数据。

        :return: 返回处理后的数据列表。
        """
        # 获取API响应
        response_data = self.my_fetch()
        
        # 验证响应数据结构
        if 'data' not in response_data or 'hotNews' not in response_data['data']:
            raise ValueError("API返回数据结构异常")
            
        result = []
        for item in response_data['data']['hotNews']:
            # 构建新闻页面URL
            web_url = f"{self.base_url}/newsDetail_forward_{item['contId']}"
            mobile_url = f"{self.mobile_base_url}/newsDetail_forward_{item['contId']}"
            
            # 添加到结果列表
            result.append({
                "id": item['contId'],
                "title": item['name'],
                "url": web_url,
                "pub_date": item.get('pubTimeLong'),
                "extra": {
                    "pubTime": item.get('pubTimeLong'),
                    "mobileUrl": mobile_url
                }
            })
        
        return result


# 示例调用
if __name__ == "__main__":
    # 创建类实例
    crawler = ThePaperCrawler()
    
    # 获取并保存数据
    crawler.fetch_and_save() 